package com.example.project.utils;

//import com.example.project.exception.CustomException;

import com.example.project.exception.BusinessException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Base64;
import java.util.Date;

@Component
public class JwtUtil {

    @Value("${jwt.secret}")
    private String secretKey; // 从配置文件加载Base64编码的密钥

    @Value("${jwt.expiration:3600000}") // 过期时间，默认1小时（毫秒）
    private long expiration;

    /**
     * 生成JWT
     *
     * @param username 用户名
     * @return JWT字符串
     */
    public String generateToken(String username) {
            SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(secretKey)); // 使用HS256安全的密钥
            Date now = new Date();
            Date expiryDate = new Date(now.getTime() + expiration);

            return Jwts.builder()
                    .setSubject(username) // 设置用户名
                    .setIssuedAt(now)    // 签发时间
                    .setExpiration(expiryDate) // 过期时间
                    .signWith(key)       // 使用HS256签名
                    .compact();
    }

    /**
     * 解析JWT并返回Claims
     *
     * @param token JWT字符串
     * @return Claims 如果解析失败则抛出异常
     * @throws JwtException 如果JWT无效或过期
     */
    public Claims getClaimsFromToken(String token) throws JwtException {
        try {
            SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(secretKey));
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        }catch (JwtException e){
            throw new BusinessException(HttpStatus.BAD_REQUEST.value(), "JWT解析失败或者过期");
        }

    }

    /**
     * 获取用户名
     *
     * @param token JWT字符串
     * @return 用户名，如果解析失败返回null
     */
    public String getUsernameFromToken(String token) {
            Claims claims = getClaimsFromToken(token);
            return claims.getSubject();
    }

//    /**
//     * 验证JWT是否有效
//     *
//     * @param token JWT字符串
//     * @return 是否有效
//     */
//    public boolean validateToken(String token) {
//        try {
//            getClaimsFromToken(token);
//            return true;
//        } catch (JwtException e) {
//            logger.error("JWT验证失败: {}", e.getMessage());
//            return false;
//        }
//    }
}